package com.maxrave.simpmusic.ui.widget

import android.app.PendingIntent   // 用于启动活动 的意图
import android.content.Context // 用于访问应用程序的资源和类
import android.content.Intent // 用于启动活动
import android.graphics.Bitmap // 用于处理图像
import android.util.Log  // 用于调试
import android.view.View // 用于处理视图
import android.widget.RemoteViews    // 用于创建小部件视图
import androidx.media3.common.util.UnstableApi // 用于标记不稳定 API
import com.maxrave.simpmusic.R // 用于访问应用程序的资源
import com.maxrave.simpmusic.service.SimpleMediaServiceHandler // 用于处理媒体服务
import com.maxrave.simpmusic.ui.MainActivity // 用于启动活动
import kotlinx.coroutines.flow.first // 用于处理协程流
import kotlinx.coroutines.runBlocking // 用于运行协程


@UnstableApi
class BasicWidget : BaseAppWidget() {
/**
     * 将给定的小部件初始化为默认状态，我们在默认点击并隐藏时启动 Music
     * 如果服务未运行，则执行操作。
     */

    override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) {
        val appWidgetView = RemoteViews(
            context.packageName, R.layout.app_widget_base
        )

        appWidgetView.setViewVisibility(
            R.id.media_titles,
            View.INVISIBLE
        )
        appWidgetView.setImageViewResource(R.id.image, R.drawable.holder_video)
        appWidgetView.setImageViewResource(
            R.id.button_toggle_play_pause, R.drawable.play_widget
        )
        appWidgetView.setImageViewResource(
            R.id.button_next, R.drawable.next_widget
        )
        appWidgetView.setImageViewResource(
            R.id.button_prev, R.drawable.previous_widget

        )
        appWidgetView.setImageViewResource(
            R.id.logo, R.mipmap.ic_launcher_round
        )


//        linkButtons(context, appWidgetView)
        pushUpdate(context, appWidgetIds, appWidgetView)
    }


    override fun performUpdate(
        context: Context,
        handler: SimpleMediaServiceHandler,
        appWidgetIds: IntArray?
    ) {
        Log.d("BasicWidget", "performUpdate")
        val appWidgetView = RemoteViews(
            context.packageName, R.layout.app_widget_base
        )
        val isPlaying = handler.player.isPlaying
        val song = runBlocking { handler.nowPlaying.first() }

        // Set the titles and artwork
        if (song?.mediaMetadata?.title.isNullOrEmpty() && song?.mediaMetadata?.artist.isNullOrEmpty()) {
            appWidgetView.setViewVisibility(
                R.id.media_titles,
                View.INVISIBLE
            )
        } else {
            appWidgetView.setViewVisibility(
                R.id.media_titles,
                View.VISIBLE
            )
            appWidgetView.setTextViewText(R.id.title, song?.mediaMetadata?.title)
            appWidgetView.setTextViewText(
                R.id.text,
                song?.mediaMetadata?.artist
            )
        }


        // Set prev/next button drawables
        appWidgetView.setImageViewResource(
            R.id.button_next, R.drawable.next_widget
        )
        appWidgetView.setImageViewResource(
            R.id.button_prev, R.drawable.previous_widget

        )
        appWidgetView.setImageViewResource(
            R.id.button_toggle_play_pause,
            if (!isPlaying) R.drawable.play_widget else R.drawable.pause_widget
        )
        appWidgetView.setImageViewResource(
            R.id.logo, R.mipmap.ic_launcher_round
        )


        // Link actions buttons to intents
        linkButtons(context, appWidgetView)

        // Load the album cover async and push the update on completion
        pushUpdate(context, appWidgetIds, appWidgetView)
    }
  /**
   * 使用 Log.w 打印一条警告日志，指示方法被调用。
   * 创建一个 RemoteViews 实例，表示将更新的小部件视图。
   * 使用 setImageViewBitmap 方法，将传入的位图（bitmap）设置到指定的视图（R.id.image）。
   * 最后，调用 pushUpdatePartially 方法，以推送部分更新到小部件。
   * */
    fun updateImage(context: Context, bitmap: Bitmap) {
        Log.w("BasicWidget", "updateImage")
        val appWidgetView = RemoteViews(
            context.packageName, R.layout.app_widget_base
        )
        appWidgetView.setImageViewBitmap(R.id.image, bitmap)
        pushUpdatePartially(context, appWidgetView)
    }

    fun updatePlayingState(context: Context, isPlaying: Boolean) {
        val appWidgetView = RemoteViews(
            context.packageName, R.layout.app_widget_base
        )
        appWidgetView.setImageViewResource(
            R.id.button_toggle_play_pause,
            if (!isPlaying) R.drawable.play_widget else R.drawable.pause_widget
        )
        pushUpdatePartially(context, appWidgetView)
    }

    /**
     * 使用 [PendingIntent] 连接各种按钮操作。
     * 创建一个 Intent，用于启动 MainActivity。
     * 设置意图的标志，使其能够正确地处理任务栈。
     * 使用 PendingIntent.getActivity 创建一个 PendingIntent，并将其链接到可点击的区域（R.id.clickable_area）。
     * 为其他按钮（例如，上一曲、播放/暂停和下一曲）创建对应的 PendingIntent 并设置到各自的视图上，以响应点击事件。
     */
    @UnstableApi
    private fun linkButtons(context: Context, views: RemoteViews) {
        val action = Intent(context, MainActivity::class.java)

        // Home
        action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
        var pendingIntent =
            PendingIntent.getActivity(
                context, 0, action,
                PendingIntent.FLAG_IMMUTABLE
            )
        views.setOnClickPendingIntent(R.id.clickable_area, pendingIntent)

        // Previous track
        pendingIntent = buildPendingIntent(context, ACTION_REWIND)
        views.setOnClickPendingIntent(R.id.button_prev, pendingIntent)

        // Play and pause
        pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE)
        views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent)

        // Next track
        pendingIntent = buildPendingIntent(context, ACTION_SKIP)
        views.setOnClickPendingIntent(R.id.button_next, pendingIntent)
    }

    companion object {

        const val NAME: String = "basic_widget"
        const val ACTION_TOGGLE_PAUSE = "com.maxrave.simpmusic.action.TOGGLE_PAUSE"
        const val ACTION_REWIND = "com.maxrave.simpmusic.action.REWIND"
        const val ACTION_SKIP = "com.maxrave.simpmusic.action.SKIP"
        private var mInstance: BasicWidget? = null

        val instance: BasicWidget
            @Synchronized get() {
                if (mInstance == null) {
                    mInstance = BasicWidget()
                }
                return mInstance!!
            }
    }
}
